perm filename SUPDUP.C[NET,MRC]1 blob
sn#314824 filedate 1977-10-30 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 #
C00009 ENDMK
C⊗;
#
/* supdup user - see rfc 734 */
#include "open.h"
#define SIGINR 15
#define CONTIMOUT 120 /* number of seconds to wait */
#define BUFSIZ 100
#define TNSFW 7L
#define TOALT 0200000L
#define TOERS 040000L
#define TOMVB 010000L
#define TOSAI 04000L
#define TOOVR 01000L
#define TOMVU 0400L
#define TOLWR 020L
#define TOFCI 010L
#define TOLID 02L
#define TOCID 01L
#define TPCBS 040L
#define TPORS 010L
#define TOCLC 0100000L
#define TOSA1 02000L
#define TOMOR 0200L
#define TOROL 0100L
#define TDMOV 0200
#define TDMV1 0201
#define TDEOF 0202
#define TDEOL 0203
#define TDDLF 0204
#define TDCRL 0207
#define TDNOP 0210
#define TDORS 0214
#define TDQOT 0215
#define TDFS 0216
#define TDMV0 0217
#define TDCLR 0220
#define TDBEL 0221
#define TDILP 0223
#define TDDLP 0224
#define TDICP 0225
#define TDDCP 0226
#define TDBOW 0227
#define TDRST 0230
int nf; /* net file descriptor */
char loc[] "\300\302Santa Monica";
struct
{ int fildes;
int nleft;
char *nextp;
char buff[512];
} ninbuf[1], toutbuf[1];
main(argc,argv)
int argc;
char *argv[];
{
int newpid;
int i,j;
int hnum;
int ttyflags[3], oldflags;
char buf[BUFSIZ];
openparam.o←fskt[1] = 0137; /* special SUPDUP socket */
openparam.o←timo = CONTIMOUT;
hnum = 236; /* default to MC */
if(argc > 1)
{ if (argc > 2)
openparam.o←fskt[1] = atoi(argv[2]);
if ( (hnum = atoi(hnconv(argv[1]))) == 0)
printf("Unknown host name\n");
}
/* while (hnum == 0)
{
printf("Host: ");
if(read(0,ttibuf,30) <= 0) exit();
if (ttibuf[0]=='?')
showhsts();
else
{ if ( (hnum = atoi(hnconv(ttibuf))) == 0)
printf("Unknown host name\n");
}
}
*/
openparam.o←host = hnum;
signal(SIGINR,1);
nf = open("/dev/net/anyhost",&openparam);
if (nf < 0)
{ printf("Cannot connect\n");
exit();
}
ninbuf[0].fildes = nf;
toutbuf[0].fildes = 1;
printf("Open\n");
sendopt();
gtty(0,ttyflags);
oldflags = ttyflags[2];
ttyflags[2] =& ~000032;
ttyflags[2] =| 000040;
stty(0,ttyflags);
newpid = fork();
if (newpid == 0)
output();
else /* this is parent */
{ while ((j=read(0,buf,BUFSIZ)) > 0)
{ for (i=0; i<j;i++)
{ if (buf[i] == '\034')
goto end;
}
if (write(nf,buf,j) < 0)
break;
}
end: kill(newpid,9);
ttyflags[2] = oldflags;
stty(0,ttyflags);
}
}
sendopt()
{
out36(-5l,0l); /* parameter count */
out36(0l,TNSFW);
out36(TOMVB+TOMVU+TOLWR+TOMOR,TPCBS); /* options */
out36(0l,40l); /* height */
out36(0l,79l); /* width */
out36(0l,1l); /* glitch count */
write(nf,loc,sizeof loc);
}
out36(hi,lo)
long int hi,lo;
{
char bytes[6];
bytes[0] = (hi>>12) & 077;
bytes[1] = (hi>> 6) & 077;
bytes[2] = (hi ) & 077;
bytes[3] = (lo>>12) & 077;
bytes[4] = (lo>> 6) & 077;
bytes[5] = (lo ) & 077;
write(nf,bytes,6);
}
output()
{
register int c;
while ((c = getc(ninbuf)) >= 0)
{ if (c < 0200)
putc(c,toutbuf);
else
switch(c)
{ case TDMOV:
getc(ninbuf);
getc(ninbuf);
goto cursor;
break;
case TDMV1:
goto cursor;
case TDEOF:
case TDEOL:
break;
case TDDLF:
putc(' ',toutbuf);
putc('\b',toutbuf);
break;
case TDCRL:
putc('\r',toutbuf);
putc('\n',toutbuf);
break;
case TDNOP:
break;
case TDORS:
break;
case TDQOT:
c = getc(ninbuf);
putc(c,toutbuf);
break;
case TDFS:
putc('\037',toutbuf);
break;
case TDMV0:
cursor:
pcursor(getc(ninbuf),getc(ninbuf));
break;
case TDCLR:
putc('\014',toutbuf);
putc('\020',toutbuf);
break;
case TDBEL:
putc('\007',toutbuf);
break;
case TDILP:
case TDDLP:
case TDICP:
case TDDCP:
getc(ninbuf);
case TDBOW:
case TDRST:
break;
}
if (ninbuf[0].nleft == 0)
fflush(toutbuf);
}
}
pcursor(col,lin)
int col,lin;
{
putc('\017',toutbuf);
putc( (col > 0 ? (col/10)*020 + col % 10 : 0177), toutbuf);
putc( (lin < 20 ? 0100 + lin : 0140 + (lin-20)), toutbuf);
}